


function buildUri(scheme, domain, path){
    return `${scheme}://${domain}/${path}`
}
const _ = require("lodash")
let buildUriCurry = _.curry(buildUri)
let commonUrl = buildUriCurry('http','localhost')
let indexUrl = commonUrl('index.html')
let listUrl = commonUrl('list.html')
console.log(indexUrl, listUrl)


function add(a, b) {
    return a + b;
}

const addCurry = _.curry(add)

const addNext = addCurry(1)

setTimeout(function(){
    let result = addNext(2)
    console.log(result)
}, 1000)


// 1. 柯里化函数接收一个函数作为参数，这个参数即是原函数
// 2. 柯里化函数返回一个函数，即柯里化后的嵌套函数
function curry(func) {
    // 3. 转化后的嵌套函数可以接收1个或多个参数
    return function curried(...args) {
        // 4. 判断传递的参数个数是否大于等于原函数的形参个数
        // 通过func.length获取函数形参的个数
        if(args.length >= func.length){
            // 6. 传递的参数个数满额后，执行原函数
            return func.apply(this, args)
        }else{
            return function(...args2){
                // 5. 传递的参数个数不足原函数的形参个数，则返回一个函数继续接受参数，并将新的参数与之前的参数合并
                // 递归调用，直至传递的参数个数大于等于原函数的形参个数
                return curried.apply(this, args.concat(args2))
            }
        }
    }
}

const addCurry2 =  curry(add)
let result = addCurry2(11)(22)
console.log(result)